
/* 'espacio' es un array de dos dimensiones que representa el espacio por dónde
 * se mueven los puntos. Sus elementos pueden tomar tres valores:
 * 		-ESPACIO_LIBRE : zona libre del espacio sin puntos quietos ni perimetro de choque
 * 		-PERIMETRO : contorno de los puntos quietos, dónde se chocarán los puntos móviles
 * 		-PUNTO_QUIETO : punto que ya ha chocado y no se volverá a mover
 * 
 * minRX,maxRX,minRY,maxRT se actualizarán para acotar la zona dónde hay posibles puntos de colision
 */

#include <stdio.h>
#include <stdlib.h>

#ifndef _PUNTO
#define _PUNTO

	//TIPOS_____________________________________________________________________
		//ENUMERADOS
			typedef enum{false,true} bool;
			typedef enum{ESPACIO_LIBRE,PERIMETRO,PUNTO_QUIETO} puntoDelEspacio;
			
		//PUNTO
			typedef struct Punto{
				int x;
				int y;
			}Punto;
		
		//LISTA DE PUNTOS
			typedef struct NodoPunto{
				Punto punto;
				struct NodoPunto* siguiente;
			}NodoPunto;

			typedef struct CabezaPunto{
				int tamanyo;
				NodoPunto* primero;
				NodoPunto* ultimo;
			}CabezaPunto;

			typedef CabezaPunto* ListaPunto;
	
	//MÉTODOS___________________________________________________________________
		//Métodos de las listas
			NodoPunto* ls_nuevoNodo(Punto);
			ListaPunto ls_inicializa();
			void ls_add(ListaPunto lista, Punto);
			void ls_free(ListaPunto lista);
	
		//Métodos para imprimir
			void imprimePunto(Punto punto);
			void imprimePuntos(ListaPunto puntos);
			void imprimePerimetro(puntoDelEspacio** espacio, int maxX, int maxY);
		
		//Inicializa los puntos aleatoriamente entre el rango dado
			void inicializaPuntos(ListaPunto puntos,int numPuntos, int maxX, int maxY);
		
		//Inicializa todos los puntos del espacio a ESPACIO_LIBRE
			void inicializaEspacio(puntoDelEspacio** espacio, int maxX, int maxY);
			
		//Añade un punto a la lista de puntos y actualiza el espacio
			void ponPunto(int x, int y, ListaPunto puntosMoviles, puntoDelEspacio** espacio, int* minRX, int* maxRX, int* minRY, int* maxRY, int maxX, int maxY);
			
		//Añade un punto con coordenadas aleatorias a la lista de puntos y actualiza el espacio
			void ponPuntoAleatorio(ListaPunto puntosMoviles, ListaPunto puntosQuietos, puntoDelEspacio** espacio);
						
		//Añade un punto estático a la lista de punto y actualiza el espacio
			void ponPuntoQuieto(Punto punto, puntoDelEspacio** espacio, int* minRX, int* maxRX, int* minRY, int* maxRY, int maxX, int maxY);
		
		//Añade al espacio el perimetro del punto 'punto'
			void ponPerimetro(Punto punto, puntoDelEspacio** espacio, int* minRX, int* maxRX, int* minRY, int* maxRy, int maxX, int maxY);
		
		//Mueve los puntos aleatoriamente una unidad en cualquiera de los ejes y 
		//actualiza el espacio.
			void muevePuntos(ListaPunto puntosMoviles, puntoDelEspacio** espacio, int* minRX, int* maxRX, int* minRY, int* maxRy, int maxX, int maxY);
#endif
